home *** CD-ROM | disk | FTP | other *** search
/ EuroCD 3 / EuroCD 3.iso / Programming / vbcc / supp.h < prev    next >
C/C++ Source or Header  |  1998-06-24  |  13KB  |  449 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <limits.h>
  4. #include <string.h>
  5. #include <stddef.h>
  6. #include <stdarg.h>
  7. #include <ctype.h>
  8.  
  9. /* typenames */
  10. #define CHAR 1
  11. #define SHORT 2
  12. #define INT 3
  13. #define LONG 4
  14. #define FLOAT 5
  15. #define DOUBLE 6
  16. #define VOID 7
  17. #define POINTER 8
  18. #define ARRAY 9
  19. #define STRUCT 10
  20. #define UNION 11
  21. #define ENUM 12
  22. #define FUNKT 13
  23.  
  24. #define NQ 15   /* f&NQ gives type without any qualifiers */
  25. #define NU 31   /* f&NU gives type without any qualifiers but UNSIGNED */
  26.  
  27. /* operations on bit-vectors */
  28. #define BSET(array,bit) (array)[(bit)/CHAR_BIT]|=1<<((bit)%CHAR_BIT)
  29. #define BCLR(array,bit) (array)[(bit)/CHAR_BIT]&=~(1<<((bit)%CHAR_BIT))
  30. #define BTST(array,bit) ((array)[(bit)/CHAR_BIT]&(1<<((bit)%CHAR_BIT)))
  31.  
  32. /* type-qualifiers */
  33. #define UNSIGNED 16
  34. #define CONST 64
  35. #define VOLATILE 128
  36. #define UNCOMPLETE 256
  37. #define STRINGCONST 512
  38.  
  39. /*  macro for internal errors */
  40. #define ierror(a) error(-1,(a),__LINE__,FILE_)
  41.  
  42. /* this header is provided by the code generator */
  43. #include "machine.h"
  44.  
  45. struct fi_list {
  46.   char *identifier;
  47.   int class;
  48.   int type;
  49. };
  50.  
  51. /*  additional information for functions; used by the optimizer  */
  52. struct function_info{
  53.   struct IC *first_ic;    /* inline copy of function starts here */
  54.   struct IC *last_ic;     /*  "       "       "      ends here   */
  55.   struct Var *vars;       /* pointer to list of vars of that function */
  56.   char *inline_asm;       /* pointer to code for inline assembler */
  57.   char *translation_unit; /* string as ID for the translation-unit */
  58.   unsigned long flags;    /* misc flags, see above */
  59.   int unresolved_calls;   /* number of function-calls not yet resolved */
  60.   struct fi_list *calls;  /* list of functions called by that function */
  61.   /* registers used and modified by that function */
  62.   unsigned char regs_used[(MAXR+CHAR_BIT)/CHAR_BIT];
  63.   unsigned char regs_modified[(MAXR+CHAR_BIT)/CHAR_BIT];
  64.   /* variables used and modified by this function */
  65.   struct fi_list *used;
  66.   struct fi_list *modified;
  67. };
  68.  
  69. /*  struct for types.    */
  70. struct Typ{
  71.   int flags;  /*  see above   */
  72.   struct Typ *next;
  73.   struct struct_declaration *exact;   /* used for STRUCT/UNION/FUNKT  */
  74.   zlong size;     /*  used for ARRAY  */
  75. };
  76. #define TYPS sizeof(struct Typ)
  77.  
  78. struct Var{
  79.   int storage_class;  /* see below    */
  80.   int reg;            /* Var is assigned to this hard-reg */
  81.   int priority;       /* Priority to be used in simple_regs() */
  82.   int flags;          /* see below */
  83.   char *identifier;   /* name of the variable */
  84.   int nesting;        /* can be freely used by the frontend */
  85.   int index;          /* used by the optimizer */
  86.   zlong offset;       /* offset relative to the stack frame */
  87.   struct Typ *vtyp;   /* type of the variable */
  88.   struct const_list *clist;   /* initialized? */
  89.   struct Var *next;   /* pointer to next variable */
  90.   struct function_info *fi;   /* used by the optimizer */
  91.   struct Var *inline_copy;    /* used for function-inlining */
  92. };
  93.  
  94. /* available storage-classes */
  95. #define AUTO 1          /* var is allocated on the stack */
  96. #define REGISTER 2      /* basically the same as AUTO (C-only) */
  97. #define STATIC 3        /* var is static but has no external linkage */
  98. #define EXTERN  4       /* var is static and has external linkage */
  99. #define TYPEDEF 5       /* C-only */
  100.  
  101. /* available flags in struct Var */
  102. #define USEDASSOURCE 1      /* the var has been read */
  103. #define USEDASDEST 2        /* the var has been written */
  104. #define DEFINED 4           /* the var has been defined (i.e. storage will
  105.                                be allocated in the current file) */
  106. #define USEDASADR 8         /* the address of the var has been taken */
  107. #define GENERATED 16        /* code for static vars has been generated */
  108. #define CONVPARAMETER 32
  109. #define TENTATIVE 64        /* C-only */
  110. #define USEDBEFORE 128      /* used by the optimizer */
  111. #define INLINEV 256         /*  "               "    */
  112. #define PRINTFLIKE 512      /* C-only */
  113. #define SCANFLIKE 1024      /* C-only */
  114. #define NOTTYPESAFE 2048    /* used by the optimizer */
  115. #define DNOTTYPESAFE 4096   /*  "               "    */
  116. #define REGPARM 8192        /* the var is a register parameter */
  117.  
  118. #define SLSIZE 32   /* realloc struct_lists in those steps */
  119.  
  120. /*  These structs are used to describe members of STRUCT/UNION or   */
  121. /*  parameters of FUNKT. Some of the entries in struct_list are not */
  122. /*  relevant for both alternatives.                                 */
  123. struct struct_declaration{
  124.   int count;  /* number of members/parameters */
  125.   struct struct_declaration *next;
  126.   struct struct_list (*sl)[];
  127. };
  128.  
  129. /* C-only */
  130. struct struct_list{
  131.   char *identifier;   /* name of the struct/union-tag */
  132.   struct Typ *styp;   /* type of the member/parameter */
  133.   int storage_class;  /* storage-class of function-parameter */
  134.   int reg;            /* register to pass function-parameter */
  135. };
  136.  
  137. /* This struct represents objects in the intermediate code. */
  138. struct obj{
  139.   int flags;      /* see below */
  140.   int reg;        /* number of reg if flags® */
  141.   struct Var *v;
  142.   struct AddressingMode *am;
  143.   union atyps{
  144.     zchar vchar;
  145.     zuchar vuchar;
  146.     zshort vshort;
  147.     zushort vushort;
  148.     zint vint;
  149.     zuint vuint;
  150.     zlong vlong;
  151.     zulong vulong;
  152.     zfloat vfloat;
  153.     zdouble vdouble;
  154.     zpointer vpointer;
  155.   }val;
  156. };
  157.  
  158.  
  159. /*  Available flags in struct obj.  */
  160.                     /*  KONST muss immer am kleinsten sein, um beim Swappen */
  161.                     /*  fuer available_expressions und Konstanten nach      */
  162.                     /*  rechts nicht in eine Endlosschleife zu kommen.      */
  163.  
  164. #define KONST 1     /*  The object is a constant. Its value is stored in    */
  165.                     /*  val.                                                */
  166. #define VAR 2       /*  The object is a variable (stored in v).             */
  167. #define SCRATCH 8   /*  The object is a temporary.                          */
  168. #define STACK 16    /*  obsolete                                            */
  169. #define DREFOBJ 32  /*  The object must be dereferenced.                    */
  170. #define REG 64      /*  The object is contained in a hardware register.     */
  171. #define VARADR 128  /*  The object is the address of a static variable.     */
  172. #define DONTREGISTERIZE 256 /*  Do not put this object into a register.     */
  173.  
  174.  
  175. /*  The quads in the intermediate code. */
  176. struct IC{
  177.   struct IC *prev;    /* pointer to the next IC */
  178.   struct IC *next;    /* pointer to the previous IC */
  179.   int code;           /* see below */
  180.   int typf;           /* usually type of the operands, see interface.doc */
  181.   int defindex;       /* used by optimizer */
  182.   int expindex;
  183.   int copyindex;
  184.   int change_cnt;
  185.   int use_cnt;
  186.   int line;           /* corresponding line in source file (or 0) */
  187.   struct varlist *change_list;    /* used by optimizer */
  188.   struct varlist *use_list;
  189.   struct obj q1;      /* source 1 */
  190.   struct obj q2;      /* source 2 */
  191.   struct obj z;       /* target */
  192.   char *file;         /* filename of the source file */
  193. };
  194. #define ICS sizeof(struct IC)
  195.  
  196.  
  197. /*  Available codes for struct IC. See interface.doc. */
  198. #define KOMMA 1
  199. #define ASSIGN 2
  200. #define ASSIGNADD 3
  201. #define ASSIGNSUB 4
  202. #define ASSIGNMULT 5
  203. #define ASSIGNDIV 6
  204. #define ASSIGNMOD 7
  205. #define ASSIGNAND 8
  206. #define ASSIGNXOR 9
  207. #define ASSIGNOR 10
  208. #define ASSIGNLSHIFT 11
  209. #define ASSIGNRSHIFT 12
  210. #define COND 13
  211. #define LOR 14
  212. #define LAND 15
  213. #define OR 16
  214. #define XOR 17
  215. #define AND 18
  216. #define EQUAL 19
  217. #define INEQUAL 20
  218. #define LESS 21
  219. #define LESSEQ 22
  220. #define GREATER 23
  221. #define GREATEREQ 24
  222. #define LSHIFT 25
  223. #define RSHIFT 26
  224. #define ADD 27
  225. #define SUB 28
  226. #define MULT 29
  227. #define DIV 30
  228. #define MOD 31
  229. #define NEGATION 32
  230. #define KOMPLEMENT 33
  231. #define PREINC 34
  232. #define POSTINC 35
  233. #define PREDEC 36
  234. #define POSTDEC 37
  235. #define MINUS 38
  236. #define CONTENT 39
  237. #define ADDRESS 40
  238. #define CAST 41
  239. #define CALL 42
  240. #define INDEX 43
  241. #define DPSTRUCT 44
  242. #define DSTRUCT 45
  243. #define IDENTIFIER 46
  244. #define CEXPR 47
  245. #define STRING 48
  246. #define MEMBER 49
  247. #define CONVCHAR 50
  248. #define CONVSHORT 51
  249. #define CONVINT 52
  250. #define CONVLONG 53
  251. #define CONVFLOAT 54
  252. #define CONVDOUBLE 55
  253. #define CONVVOID 56
  254. #define CONVPOINTER 57
  255. #define CONVUCHAR 58
  256. #define CONVUSHORT 59
  257. #define CONVUINT 60
  258. #define CONVULONG 61
  259. #define ADDRESSA 62
  260. #define FIRSTELEMENT 63
  261. #define PMULT 64
  262. #define ALLOCREG 65
  263. #define FREEREG 66
  264. #define PCEXPR 67
  265. #define TEST 68
  266. #define LABEL 69
  267. #define BEQ 70
  268. #define BNE 71
  269. #define BLT 72
  270. #define BGE 73
  271. #define BLE 74
  272. #define BGT 75
  273. #define BRA 76
  274. #define COMPARE 77
  275. #define PUSH 78
  276. #define POP 79
  277. #define ADDRESSS 80
  278. #define ADDI2P 81
  279. #define SUBIFP 82
  280. #define SUBPFP 83
  281. #define PUSHREG 84
  282. #define POPREG 85
  283. #define POPARGS 86
  284. #define SAVEREGS 87
  285. #define RESTOREREGS 88
  286. #define ILABEL 89
  287. #define DC 90
  288. #define ALIGN 91
  289. #define COLON 92
  290. #define GETRETURN 93
  291. #define SETRETURN 94
  292. #define MOVEFROMREG 95
  293. #define MOVETOREG 96
  294. #define NOP 97
  295.  
  296. #define arith(c) ((c)>=CHAR&&(c)<=DOUBLE)
  297.  
  298. extern char *typname[];
  299. extern zlong sizetab[16];
  300. extern char *storage_class_name[];
  301. extern char *ename[];
  302.  
  303. extern zlong align[16],maxalign;
  304.  
  305. /*  an empty string */
  306. extern char *empty;
  307.  
  308. extern zchar vchar; extern zuchar vuchar;
  309. extern zshort vshort; extern zushort vushort;
  310. extern zint vint; extern zuint vuint;
  311. extern zlong vlong; extern zulong vulong;
  312. extern zfloat vfloat; extern zdouble vdouble;
  313. extern zpointer vpointer;
  314.  
  315. #ifndef DEBUG
  316. extern int DEBUG;
  317. #endif
  318.  
  319. /*  used by the optimizer */
  320. struct varlist{
  321.   struct Var *v;
  322.   int flags;
  323. };
  324. #define VLS sizeof(struct varlist)
  325.  
  326.  
  327. extern struct IC *first_ic,*last_ic;
  328. extern int regs[MAXR+1],regsa[MAXR+1],regused[MAXR+1],regscratch[MAXR+1];
  329. extern zlong regsize[MAXR+1];
  330. extern struct Typ *regtype[MAXR+1];
  331. extern struct Var *regsv[MAXR+1];
  332. extern char *regnames[];
  333.  
  334. extern int label,return_label;
  335.  
  336. /* The structures used for available options of the code generator. */
  337. union ppi {char *p;long l;void (*f)(char *);};
  338. #define USEDFLAG 1
  339. #define STRINGFLAG 2
  340. #define VALFLAG 4
  341. #define FUNCFLAG 8
  342. extern int g_flags[MAXGF];
  343. extern char *g_flags_name[MAXGF];
  344. extern union ppi g_flags_val[MAXGF];
  345.  
  346. extern zlong max_offset;
  347.  
  348. extern int function_calls;
  349.  
  350. /*  Das haette ich gern woanders    */
  351. struct node{
  352.   int flags,lvalue,sidefx;
  353.   struct Typ *ntyp;
  354.   struct node *left;
  355.   struct node *right;
  356.   struct argument_list *alist;
  357.   char *identifier;
  358.   struct const_list *cl;
  359.   union atyps val;
  360.   struct obj o;
  361. };
  362.  
  363. typedef struct node *np;
  364.  
  365. #define NODES sizeof(struct node)
  366.  
  367. struct const_list{
  368.   union atyps val;
  369.   np tree;
  370.   struct const_list *other,*next;
  371. };
  372. #define CLS sizeof(struct const_list)
  373.  
  374. extern zlong t_min[];
  375. extern zulong t_max[];
  376. extern zlong char_bit;
  377.  
  378. extern char cg_copyright[];
  379.  
  380. extern int goto_used;
  381. extern int ic_count;
  382. extern int only_inline;
  383. extern int multiple_ccs;
  384. extern int float_used;
  385.  
  386.  
  387. extern struct IC *err_ic;
  388.  
  389.  
  390. extern long maxoptpasses,optflags,inline_size,unroll_size;
  391. extern long noaliasopt,fp_assoc;
  392. extern struct Var *vl1,*vl2,*vl3;
  393. extern int fline;
  394. extern char errfname[FILENAME_MAX+1];
  395.  
  396. /* functions which must be provided by the frontend */
  397. extern void add_IC(struct IC *);
  398. extern void error(int,...);
  399. extern struct Var *add_tmp_var(struct Typ *);
  400. extern void raus(void);
  401.  
  402. /* functions provided by supp.c */
  403. extern void free_IC(struct IC *);
  404. extern void insert_IC(struct IC *,struct IC *);
  405. extern void pric(FILE *,struct IC *);
  406. extern void pric2(FILE *,struct IC *);
  407. extern void probj(FILE *,struct obj *,int);
  408. extern void printzl(FILE *,zlong);
  409. extern void printzul(FILE *,zulong);
  410. extern void printzd(FILE *,zdouble);
  411. extern void printval(FILE *,union atyps *,int,int);
  412. extern void insert_const2(union atyps *,int);
  413. extern void prd(FILE *,struct Typ *);
  414. extern void freetyp(struct Typ *);
  415. extern struct Typ *clone_typ(struct Typ *);
  416. extern zlong szof(struct Typ *);
  417. extern zlong falign(struct Typ *);
  418. extern void eval_const(union atyps *,int);
  419. extern struct function_info *new_fi(void);
  420. extern void free_fi(struct function_info *);
  421.  
  422. extern void optimize(long, struct Var *);
  423. extern void remove_IC(struct IC *);
  424. extern void *mymalloc(size_t);
  425. extern void simple_regs(void);
  426.  
  427.  
  428. /*  functions provided by the code generator */
  429. extern int regok(int,int,int);
  430. extern int freturn(struct Typ *);
  431. extern void gen_code(FILE *,struct IC *,struct Var *,zlong);
  432. extern int init_cg(void);
  433. extern void cleanup_cg(FILE *);
  434. extern int dangerous_IC(struct IC *);
  435. extern void gen_dc(FILE *,int,struct const_list *);
  436. extern void gen_ds(FILE *,zlong,struct Typ *);
  437. extern void gen_var_head(FILE *,struct Var *);
  438. extern void gen_align(FILE *,zlong);
  439. extern int shortcut(int, int);
  440. extern int must_convert(np,int);
  441.  
  442. /* additional declarations for targets which pass arguments in */
  443. /* registers by default.                                       */
  444. #ifdef HAVE_REGPARMS
  445. extern struct reg_handle empty_reg_handle;
  446. extern int reg_parm(struct reg_handle *, struct Typ *);
  447. #endif
  448.  
  449.